#!/bin/bash

# 默认密码长度，如需修改默认生成密码长度，修改DEFAULT_PASSWORD_LENGTH即可.
DEFAULT_PASSWORD_LENGTH=16
MINIMUM_PASSWORD_LENGTH=8

# 检查是否提供了密码长度参数
if [ "$#" -eq 0 ]; then
    # 如果没有提供参数，则使用默认值
    PASSWORD_LENGTH=$DEFAULT_PASSWORD_LENGTH
else
    PASSWORD_LENGTH=$1
fi

# 确保密码长度至少为8
if [ "$PASSWORD_LENGTH" -lt $MINIMUM_PASSWORD_LENGTH ]; then
    echo "密码长度至少需要为8个字符。"
    exit 1
fi

# 可选的字符集
UPPERCASE=$(echo {A..Z} | tr -d ' ')
LOWERCASE=$(echo {a..z} | tr -d ' ')
NUMBERS=$(echo {0..9} | tr -d ' ')
SPECIAL=$(echo "\!\"\#\$\%\&\'\(\)\*\+,\-\./:;\<\=\>\?\@\^\_\{\|\}\~")  # 使用双引号并转义特殊字符

# 确保密码中包含至少一个大写字母、一个小写字母、一个数字和一个特殊字符
PASSWORD="${UPPERCASE:$(($RANDOM % ${#UPPERCASE})):1}"
PASSWORD="${PASSWORD}${LOWERCASE:$(($RANDOM % ${#LOWERCASE})):1}"
PASSWORD="${PASSWORD}${NUMBERS:$(($RANDOM % ${#NUMBERS})):1}"
PASSWORD="${PASSWORD}${SPECIAL:$(($RANDOM % ${#SPECIAL})):1}"

# 剩下的字符可以是任何类型
CHARACTER_SET="$UPPERCASE$LOWERCASE$NUMBERS$SPECIAL"

# 添加剩余的字符
for (( i=4; i<$PASSWORD_LENGTH; i++ )); do
    PASSWORD="${PASSWORD}${CHARACTER_SET:$(($RANDOM % ${#CHARACTER_SET})):1}"
done

# 打乱密码中的字符顺序以增加随机性
PASSWORD=$(echo $PASSWORD | fold -w1 | shuf | tr -d '\n')

# 截取密码到指定长度（确保至少有四个字符）
PASSWORD=$(echo $PASSWORD | head -c $PASSWORD_LENGTH)

# 输出生成的密码
echo "生成的密码: $PASSWORD"